package br.com.treinamento.gestaoExperienciaProfissional.validator;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import br.com.treinamento.gestaoExperienciaProfissional.model.Email;
import br.com.treinamento.gestaoExperienciaProfissional.model.Pessoa;
import br.com.treinamento.gestaoExperienciaProfissional.service.PessoaService;
import br.com.treinamento.gestaoExperienciaProfissional.util.FacesUtil;

@FacesValidator("emailValidator")
public class EmailValidator implements Validator{
	
	PessoaService pessoaService = new PessoaService();

	@Override
	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
		Long idPessoa = (Long) component.getAttributes().get("idPessoa");
		if(emailCadastrado(value.toString() , idPessoa, null)){
			gerarErro(value);
		}

	}

	private boolean emailCadastrado(String value, Long idPessoa, List<Email> emails) {
		List<Pessoa> pessoas = pessoaService.buscarPorEmail(value);
		if(!pessoas.isEmpty()){
			if(verificaAlteracao(value, idPessoa)){
				return false;
			}else return true;
		}
		return false;
	}

	private boolean verificaAlteracao(String value, Long idPessoa) {
		if(idPessoa != null){
			Pessoa pessoa = pessoaService.buscar(idPessoa);
			List<Email> emails = pessoa.getEmails();
			for (Email email : emails) {
				if(value.equals(email.getEmail())){
					return true;
				}
			}
		}
		return false;
	}

	private void gerarErro(Object value) {
		String mensagem = gerarMensagemErro(value.toString());
		FacesMessage msg = new FacesMessage(mensagem, mensagem);
		msg.setSeverity(FacesMessage.SEVERITY_ERROR);
		throw new ValidatorException(msg);
	}
	
	private String gerarMensagemErro(String value) {
		String mensagem = FacesUtil.getMessage("pessoa.email.emailCadastrado");
		return mensagem + " '" +  value + "' ";
	}
	
}
